package pratice.fengzhongye.interview;

import org.junit.Test;

/**
 * 面试：字符串相关的面试题
 *
 * @author 吴宇亮 on 2019/2/18 0018 14:56
 */
public class Lesson1_String {

    /**
     * 通过String是否相等的练习，理解String pool和堆和栈
     */
    @Test
    public void StringTest(){
        String str1 = new String("hello");
        //问题1：上面语句执行完，内存里面生成了多少个对象？
        /*答案：生成1个引用，2个对象。str1引用保存在栈里面，然后在堆里面生成String对象的时候，先会判断在String pool里面是否已经
        有hello了，如果没有则先在String pool里面new String("hello")，然后在堆里面new String("hello")
        */

        String str2 = "hello";
        //问题2：上面语句执行完，内存里面生成了多少个对象？
        /* 答案：0个对象，应为第12行执行完后，String pool里面已经有了hello这个对象，所以不会在生成对象 */

        String str3 = new String("hello");
        //问题3：上面语句执行完，内存里面生成了多少个对象？
        /* 答案：生成了1个引用，1个对象。在栈里面生成了1个引用，在堆里面生成了1个对象，String pool里面没有改变 */

        System.out.println(str1 == str2);
        System.out.println(str2 == str3);
        System.out.println(str1 == str3);
        //问题4：上面3条语句输出的结果？
        //答案：3个都是false

        String str4 = "he";
        System.out.println(str2 == "he" + "llo");
        System.out.println(str2 == str4 + "llo");
        //问题5：上面2条数据输出的结果？
        /* 答案：true和false。因为使用全是“字面值”去拼接字符串的时候，编译器会自动优化成一个字符串值；
        否则只能在程序真正运行的时候才会new出对象 */
    }
}
